package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.Permission;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 权限Mapper接口
 * 
 * @author uniflow
 * @since 1.0.0
 */
@Mapper
public interface PermissionMapper extends BaseMapper<Permission> {
    
    /**
     * 分页查询权限
     */
    IPage<Permission> selectPermissionPage(Page<Permission> page,
                                          @Param("type") String type,
                                          @Param("parentId") String parentId,
                                          @Param("enabled") Boolean enabled,
                                          @Param("keyword") String keyword);
    
    /**
     * 根据权限代码查询
     */
    Permission selectByCode(@Param("code") String code);
    
    /**
     * 检查权限代码是否存在
     */
    boolean existsByCode(@Param("code") String code, @Param("excludeId") String excludeId);
    
    /**
     * 根据父级ID查询子权限列表
     */
    List<Permission> selectByParentId(@Param("parentId") String parentId);
    
    /**
     * 查询根权限列表
     */
    List<Permission> selectRootPermissions();
    
    /**
     * 查询权限树结构
     */
    List<Permission> selectPermissionTree();
    
    /**
     * 根据类型查询权限列表
     */
    List<Permission> selectByType(@Param("type") String type);
    
    /**
     * 查询启用的权限列表
     */
    List<Permission> selectEnabledPermissions();
    
    /**
     * 根据资源和操作查询权限
     */
    Permission selectByResourceAndAction(@Param("resource") String resource, @Param("action") String action);
    
    /**
     * 查询用户权限列表
     */
    List<Permission> selectUserPermissions(@Param("userId") String userId);
    
    /**
     * 查询角色权限列表
     */
    List<Permission> selectRolePermissions(@Param("roleId") String roleId);
    
    /**
     * 检查用户是否有指定权限
     */
    boolean hasUserPermission(@Param("userId") String userId, @Param("permissionCode") String permissionCode);
    
    /**
     * 检查角色是否有指定权限
     */
    boolean hasRolePermission(@Param("roleId") String roleId, @Param("permissionCode") String permissionCode);
    
    /**
     * 批量更新权限状态
     */
    int batchUpdateEnabled(@Param("ids") List<String> ids, @Param("enabled") Boolean enabled);
    
    /**
     * 查询权限统计信息
     */
    Map<String, Object> selectPermissionStats();
    
    /**
     * 查询权限类型分布
     */
    List<Map<String, Object>> selectTypeDistribution();
    
    /**
     * 查询权限使用统计
     */
    List<Map<String, Object>> selectUsageStats();
    
    /**
     * 查询最近创建的权限
     */
    List<Permission> selectRecentCreated(@Param("limit") Integer limit);
    
    /**
     * 查询未使用的权限
     */
    List<Permission> selectUnusedPermissions();
    
    /**
     * 查询权限层级深度
     */
    Integer selectMaxDepth();
    
    /**
     * 查询权限路径
     */
    List<Permission> selectPermissionPath(@Param("permissionId") String permissionId);
    
    /**
     * 检查是否有子权限
     */
    boolean hasChildren(@Param("parentId") String parentId);
    
    /**
     * 查询权限详情（包含父级和子级信息）
     */
    Permission selectWithHierarchy(@Param("id") String id);
    
    /**
     * 根据资源类型查询权限
     */
    List<Permission> selectByResource(@Param("resource") String resource);
    
    /**
     * 查询菜单权限树
     */
    List<Permission> selectMenuPermissionTree();
    
    /**
     * 查询操作权限列表
     */
    List<Permission> selectOperationPermissions(@Param("resource") String resource);
    
    /**
     * 查询数据权限列表
     */
    List<Permission> selectDataPermissions();
    
    /**
     * 批量插入权限
     */
    int insertBatch(@Param("permissions") List<Permission> permissions);
    
    /**
     * 查询权限继承关系
     */
    List<Map<String, Object>> selectInheritanceRelations(@Param("permissionId") String permissionId);
    
    /**
     * 查询权限冲突检测
     */
    List<Map<String, Object>> selectConflictPermissions(@Param("userId") String userId);
    
    /**
     * 查询权限审计信息
     */
    List<Map<String, Object>> selectAuditInfo(@Param("permissionId") String permissionId,
                                              @Param("startDate") String startDate,
                                              @Param("endDate") String endDate);
}